/**
 * A felrobbanó bombát reprezentáló osztály.
 * Önmaga is felrobbantható.
 *
 * A bomba robbanás mechanizmusa.
 * Felrobbanja a körülötte lévő Entitásokat, amennyiben azok
 * felrobbanthatóak. Továbbá ha atombomba, akkor két távolságra
 * hat ha az adott szomszédos mező üres vagy robbanható.
 */
public class Bomb extends Entity implements ITickable
{

  /**
  * Robbanás nagyságának a mértéke.
  * Alapértelmezett: 1 Ilyenkor sima bomba.
  */
  private int power;
  private int timer;

  /**
   * 
   * 
   * @param power Meghatározza, milyen nagyot robbanjon a bomba.
   * @param timer Meghatározza, a bomba időzítését. 
   */
  public Bomb (int power, int timer)  
  {
   this.power = power;
   this.timer = timer;
   alive = false;
  }

  /**
  * Kitörli az önmagát tartalmazó mezőből a magára mutató refet, majd
  * felrobbantja a körülötte lévő mezőket a megadott sugárban. 
  * @return Minden esetben true.
  */  
  public boolean explode()
  {
    field.delete(); //A végtelen ciklust elkerüli, ha kitörli a saját ref-jét.
    field.getGame().getTimer().remove(this);
    for (int i = 1; i <= 6; i++)
    {
     // field.getNeighbour(i).getEntity().explode();
      this.deepExplode(field.getNeighbour(i), power, i);  
    }
    alive = false;
    callObservers();
    return true;
  }

  /**
   * Rekurzívan hívódik a robbánás minden hívásnál a robbanás irányában
   * továbbhaladva annak mélységét eggyel csökkentve.
   * @param actual Aktuális field
   * @param deep Aktuális erősség
   * @param dir Robbanás iránya
   */
  protected void deepExplode(Field actual, int deep, int dir)
  {
    if (actual.isEmpty() || actual.getEntity().explode())
        if (--deep >= 1)
            this.deepExplode(actual.getNeighbour(dir), deep, dir);
  }

  /**
   * Csökkenti a bomba időzítőjét.
   * (skeletonban nem csinál semmit)
   */
  public void tick()
  {
    timer--;
    if(timer == 0)
      this.explode();
  }

  public String toString()
  {
     return "bomb["+ID+"]";
  }
}



